package time

import (
	"fmt"
	"github.com/golang-module/carbon/v2"
	"time"
)

func Setup() {
	carbon.SetDefault(carbon.Default{
		Layout:       carbon.DateTimeLayout,
		Timezone:     carbon.PRC,
		WeekStartsAt: carbon.Sunday,
		Locale:       "zh-CN",
	})
}

type LocalTime time.Time

func (t *LocalTime) MarshalJSON() ([]byte, error) {
	if t == nil || time.Time(*t).IsZero() {
		return []byte(`""`), nil
	}
	tTime := time.Time(*t)
	return []byte(fmt.Sprintf("\"%v\"", tTime.Format("2006-01-02 15:04:05"))), nil
}

func IsValidDateFormat(dateString string, layout string) bool {
	_, err := time.Parse(layout, dateString)
	return err == nil
}

// GetLastWeekDateRange 获取上星期时间
func GetLastWeekDateRange() (string, string) {
	// 获取当前时间
	now := time.Now()

	// 找到当前周几，以便计算上周的周一
	weekday := int(now.Weekday())
	// 如果今天是周日，则weekday为0，需要特殊处理
	if weekday == 0 {
		weekday = 7
	}

	// 计算上周的周一
	lastWeekMonday := now.AddDate(0, 0, -weekday+1)
	// 计算上周的周日
	lastWeekSunday := lastWeekMonday.AddDate(0, 0, 6)

	// 格式化日期为SQL查询所需的格式
	lastWeekMondayStr := lastWeekMonday.Format("2006-01-02")
	lastWeekSundayStr := lastWeekSunday.Format("2006-01-02")

	return lastWeekMondayStr, lastWeekSundayStr
}

// GetLastMonthDateRange 获取上个月
func GetLastMonthDateRange() (string, string) {
	// 获取当前时间
	now := time.Now()

	// 上个月的今天
	lastMonthToday := now.AddDate(0, -1, 0)

	// 上个月的第一天（1号）
	lastMonthFirstDay := time.Date(lastMonthToday.Year(), lastMonthToday.Month(), 1, 0, 0, 0, 0, lastMonthToday.Location())

	// 上个月的最后一天
	// 先找到下个月的第一天，然后减去一天
	nextMonthFirstDay := lastMonthFirstDay.AddDate(0, 1, 0)
	lastMonthLastDay := nextMonthFirstDay.AddDate(0, 0, -1)

	// 格式化日期为SQL查询所需的格式
	lastMonthFirstDayStr := lastMonthFirstDay.Format("2006-01-02")
	lastMonthLastDayStr := lastMonthLastDay.Format("2006-01-02")

	return lastMonthFirstDayStr, lastMonthLastDayStr
}

// GetMonthDateRange 获取本月
func GetMonthDateRange() (string, string) {
	// 获取当前时间
	now := time.Now()

	// 上个月的今天
	lastMonthToday := now.AddDate(0, 0, 0)

	// 上个月的第一天（1号）
	lastMonthFirstDay := time.Date(lastMonthToday.Year(), lastMonthToday.Month(), 1, 0, 0, 0, 0, lastMonthToday.Location())

	// 上个月的最后一天
	// 先找到下个月的第一天，然后减去一天
	nextMonthFirstDay := lastMonthFirstDay.AddDate(0, 1, 0)
	lastMonthLastDay := nextMonthFirstDay.AddDate(0, 0, -1)

	// 格式化日期为SQL查询所需的格式
	lastMonthFirstDayStr := lastMonthFirstDay.Format("2006-01-02")
	lastMonthLastDayStr := lastMonthLastDay.Format("2006-01-02")

	return lastMonthFirstDayStr, lastMonthLastDayStr
}
